/*
    一个lua的c库

*/

//#define _POSIX_C_SOURCE >= 199309L

#include <stdio.h>
#include <math.h>
#include <stdarg.h>
#include <stdlib.h>

#include "xlib.h"


#include "bitmap.h"
#include "time.h"
#include "singlelist.h"



void SayHello() {
  printf("hello lua bridge!!\n");
}


/* 需要一个"luaL_Reg"类型的结构体，其中每一个元素对应一个提供给Lua的函数。
 * 每一个元素中包含此函数在Lua中的名字，以及该函数在C库中的函数指针。
 * 最后一个元素为“哨兵元素”（两个"NULL"），用于告诉Lua没有其他的函数需要注册。
 */
#define MAX_FUNC_NUM 100 //100个函数应该够我自己写的了

luaL_Reg lib[] = {
    {"get_time_us", get_time_us},
    {"get_time_ms", get_time_ms},
    {"get_time_se", get_time_se},

    {"get_bitmap", get_bitmap},

    {"sl_add", lua_sl_add},
    {"sl_del", lua_sl_del},

    {NULL, NULL}
};

////取当前数组可用的一个下标
//int get_array_len(luaL_Reg lib[]){
//    for(int i=0; i<MAX_FUNC_NUM; i++){
//        if(lib[i].name == NULL){
//            return i;
//        }
//    }
//    return MAX_FUNC_NUM;
//}

/* 此函数为C库中的“特殊函数", 在Windows系统中必须使用"__declspec( dllexport )"导出, 在类Unix上使用"extern"导出
 * 通过调用它注册所有C库中的函数，并将它们存储在适当的位置。
 * 此函数的命名规则应遵循：
 * 1、使用"luaopen_"作为前缀。
 * 2、前缀之后的名字将作为"require"的参数, 所以此名字必须和生成的dll同名否则找不到对应的库
 */
int luaopen_xlib(lua_State* L)
{
    /* void luaL_newlib (lua_State *L, const luaL_Reg l[]);
     * 创建一个新的"table"，并将"l"中所列出的函数注册为"table"的域。
     */

    //各个模块增加绑定
//    int index = get_array_len(lib);
//    lucy_reg(lib, index);
//    int index = get_array_len(lib);
//    bigmap_reg(lib, index);
//    index = get_array_len(lib);
//    time_reg(lib, index);
    //结束绑定

    luaL_newlib(L, lib); //导出给lua

    //注册一个函数
    luabridge::Namespace n = luabridge::getGlobalNamespace(L);
    n.addFunction("sayHello", SayHello);


    return 1;
}










